/*
  promise是es6新增的一种用于解决异步的方式，主要是为了解决之前的回调函数的回调地狱问题
  它有三种状态，pending（进行中）、fulfilled（已成功）和rejected（已失败),状态只能从1-2，1-3，状态是不可逆的。
  它有很多的api，三种原型方法(.then/.catch/.finally),静态方法(.all/.race/.allSettled/.any/.resolve/.reject)
*/

// 创建promise
const done = true;
const p1 = new Promise((resolve, reject) => {
  // resolve表示成功的回调
  // reject表示失败的回调
  setTimeout(() => {
    if (done) {
      resolve("ok");
    } else {
      reject("不ok");
    }
  }, 1000);
});

const p2 = new Promise((resolve, reject) => {
  // resolve表示成功的回调
  // reject表示失败的回调

  setTimeout(() => {
    if (done) {
      resolve("好");
    } else {
      reject("不好");
    }
  }, 3000);
});

// 消费promise
// p1.then((res) => {
//   console.log(res);
//   return 123;
// })
//   .then((res) => {
//     // .then链式调用的时候，前面一个.then里面return的值会作为下一个.then的res
//     console.log(a);
//   })
//   .catch((err) => {
//     // 上面的.then里面如果出现红色的报错，也会执行.catch
//     console.log(err);
//   })
//   .finally(() => {
//     // finally不管成功失败都会执行
//     // 回调函数没有参数
//     console.log("finally");
//   });

// Promise.all()
// 接受一个参数是数组，数组里面的每一项都是promise对象。
// 数组里面的每一个promise的结果都是成功，就是成功，返回一个由所有成功的结果组成的数组
// 如果有一个失败，就是失败，返回的是第一个失败的结果
// Promise.all([p1, p2])
//   .then((res) => {
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(err);
//   });

// Promise.race()
// 接受一个参数是数组，数组里面的每一项都是promise对象。
// 看第一个状态发生改变的Promise对象
Promise.race([p1, p2])
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });
